﻿package mortal.game.scene3D.map3D.AstarAnyDirection.processor
{
    import __AS3__.vec.*;
    import flash.geom.*;
    import flash.utils.*;
    import mortal.game.scene3D.map3D.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.data.*;

    public class MapGridCutter extends Object
    {
        public static var walkableMinValue:int = 5;
        public static const RegionSize:int = 200;
        private static var p:Point = new Point();

        public function MapGridCutter()
        {
            return;
        }// end function

        public static function walkable(param1:int) : Boolean
        {
            return param1 < 0 || param1 >= walkableMinValue;
        }// end function

        public static function cutMap(param1:Array, param2:int = 0, param3:Dictionary = null) : Vector.<AstarIIPoint>
        {
            var _loc_8:Dictionary = null;
            var _loc_9:int = 0;
            var _loc_10:int = 0;
            var _loc_11:int = 0;
            var _loc_12:int = 0;
            var _loc_13:int = 0;
            var _loc_14:int = 0;
            var _loc_17:Point = null;
            var _loc_18:int = 0;
            walkableMinValue = param2;
            var _loc_4:* = param1.length;
            var _loc_5:* = param1[0].length;
            var _loc_6:* = new Vector.<AstarIIPoint>;
            var _loc_7:* = new Vector.<int>;
            if (param3 != null)
            {
                _loc_8 = param3;
            }
            else
            {
                _loc_8 = new Dictionary();
            }
            var _loc_15:int = 1;
            var _loc_16:int = 1;
            _loc_7.push(0, 0);
            while (_loc_7.length > 1)
            {
                
                _loc_9 = _loc_7.shift();
                _loc_10 = _loc_7.shift();
                _loc_18 = _loc_9 * 10000 + _loc_10;
                if (_loc_8[_loc_18])
                {
                    continue;
                }
                _loc_8[_loc_18] = true;
                if (!walkable(param1[_loc_9][_loc_10]))
                {
                    _loc_17 = calcWalkabelArea(_loc_9, _loc_10, _loc_4, _loc_5, _loc_8, param1, false);
                    addNewPoints(_loc_7, _loc_9, _loc_10, _loc_17.y, _loc_17.x, _loc_4, _loc_5);
                    continue;
                }
                _loc_17 = calcWalkabelArea(_loc_9, _loc_10, _loc_4, _loc_5, _loc_8, param1, true);
                _loc_15 = _loc_17.y;
                _loc_16 = _loc_17.x;
                _loc_6.push(new AstarIIPoint(_loc_9, _loc_10, _loc_9 + _loc_15, _loc_10 + _loc_16));
                addNewPoints(_loc_7, _loc_9, _loc_10, _loc_15, _loc_16, _loc_4, _loc_5);
                _loc_13 = _loc_10 + _loc_16;
                _loc_14 = _loc_9 + _loc_15;
                _loc_12 = _loc_9;
                while (_loc_12 < _loc_14)
                {
                    
                    _loc_11 = _loc_10;
                    while (_loc_11 < _loc_13)
                    {
                        
                        _loc_8[_loc_12 * 10000 + _loc_11] = true;
                        _loc_11++;
                    }
                    _loc_12++;
                }
            }
            return _loc_6;
        }// end function

        public static function calcWalkabelArea(param1:int, param2:int, param3:int, param4:int, param5:Dictionary, param6:Array, param7:Boolean = true) : Point
        {
            var _loc_10:int = 0;
            var _loc_11:int = 0;
            var _loc_15:int = 0;
            var _loc_16:int = 0;
            var _loc_17:int = 0;
            var _loc_8:int = 1;
            var _loc_9:int = 1;
            var _loc_12:Boolean = true;
            while (true)
            {
                
                _loc_8++;
                if (param2 + _loc_8 > param4 || param1 + _loc_8 > param3)
                {
                    break;
                }
                _loc_15 = param2 + _loc_8;
                _loc_16 = param1 + _loc_8 - 1;
                _loc_10 = param2;
                while (_loc_10 < _loc_15)
                {
                    
                    if (param5[_loc_16 * 10000 + _loc_10])
                    {
                        _loc_12 = false;
                        break;
                    }
                    if (walkable(param6[_loc_16][_loc_10]) != param7)
                    {
                        _loc_12 = false;
                        break;
                    }
                    _loc_10++;
                }
                _loc_15 = param1 + _loc_8 - 1;
                _loc_17 = param2 + _loc_8 - 1;
                _loc_10 = param1;
                while (_loc_10 < _loc_15)
                {
                    
                    if (param5[_loc_10 * 10000 + _loc_17])
                    {
                        break;
                    }
                    if (walkable(param6[_loc_10][_loc_17]) != param7)
                    {
                        break;
                    }
                    _loc_10++;
                }
            }
            _loc_8 = _loc_8 - 1;
            _loc_9 = _loc_8;
            var _loc_13:Boolean = false;
            var _loc_14:int = 0;
            if (!_loc_12)
            {
                _loc_10 = param2 + _loc_9;
                while (_loc_10 < param4)
                {
                    
                    _loc_11 = param1;
                    while (_loc_11 < param1 + _loc_8)
                    {
                        
                        if (param5[_loc_11 * 10000 + _loc_10])
                        {
                            _loc_13 = true;
                            break;
                        }
                        if (walkable(param6[_loc_11][_loc_10]) != param7)
                        {
                            _loc_13 = true;
                            break;
                        }
                        _loc_11++;
                    }
                    if (_loc_13)
                    {
                        break;
                    }
                    _loc_14++;
                    _loc_10++;
                }
                _loc_9 = _loc_9 + _loc_14;
            }
            p.y = _loc_8;
            p.x = _loc_9;
            return p;
        }// end function

        public static function addNewPoints(param1:Vector.<int>, param2:int, param3:int, param4:int, param5:int, param6:int, param7:int) : void
        {
            var _loc_8:* = param2 + param4 >= param6;
            var _loc_9:* = param3 + param5 >= param7;
            if (!_loc_8)
            {
                param1.push(param2 + param4, param3);
                if (!_loc_9)
                {
                    param1.push(param2 + param4, param3 + param5);
                }
            }
            if (!_loc_9)
            {
                param1.push(param2, param3 + param5);
            }
            return;
        }// end function

    }
}
